﻿using Sgr.Data;

namespace Microsoft.EntityFrameworkCore
{
    /// <summary>
    /// 针对 <see cref="DbContext"/> 的扩展方法。
    /// </summary>
    public static class DbContextExtensions
    {
        /// <summary>
        /// 获取当前上下文对应的数据库类型。
        /// </summary>
        /// <param name="context">DbContext实例</param>
        /// <returns>匹配到的数据库类型；未识别或ProviderName为空返回 null。</returns>
        public static DatabaseType? GetDatabaseType(this DbContext context)
        {
            ArgumentNullException.ThrowIfNull(context);

            var provider = context.Database.ProviderName;
            if (string.IsNullOrWhiteSpace(provider))
                return null;

            var p = provider.ToLowerInvariant();

            // 顺序无关，但尽量先匹配特征明显的关键字
            if (p.Contains("mysql"))
                return DatabaseType.MySql;

            if (p.Contains("npgsql"))
                return DatabaseType.PostgreSql;

            if (p.Contains("sqlserver"))
                return DatabaseType.SqlServer;

            if (p.Contains("sqlite"))
                return DatabaseType.SQLite;

            if (p.Contains("oracle"))
                return DatabaseType.Oracle;

            if (p.Contains("db2"))
                return DatabaseType.DB2;

            return null;
        }

        /// <summary>
        /// 判断当前上下文是否为指定数据库类型。
        /// </summary>
        /// <param name="context">DbContext实例</param>
        /// <param name="type">要判定的数据库类型</param>
        public static bool IsDatabaseType(this DbContext context, DatabaseType type)
        {
            var current = context.GetDatabaseType();
            return current.HasValue && current.Value == type;
        }
    }
}